Estoy trabajando en una función que inserta un valor en un árbol de búsqueda binario, escribí este código:
// this is my decalarations if its relevent typedef struct element* tree; typedef struct element { type data; tree right; tree left; } noed; tree rightSon(tree head) { return (head->right); } void insert(tree* a,int val) { if(!empty(*a)) { if((*a)->data>val) { if(!empty(leftSon(*a))) insert(&leftSon(*a),val); // error here leftson return a tree else { (*a)->left=newNoed(val); } } else if((*a)->data<val) { if(!empty(rightSon(*a))) insert(&rightSon(*a),val); //same error here else (*a)->right=newNoed(val); } else printf("value already exist!\n"); } else { *a=newNoed(val); } } Resolví el problema declarando variables locales de tipo tree y luego asignándoles los valores de esta manera:
tree lson; lson=leftson(*a); insert(&lson,val);Pero todavía no entiendo cuál era el problema en primer lugar.
Parece que la función leftSon (y rightSon ) tiene el tipo de retorno tree . Es decir, devuelve un objeto temporal. No puede aplicar el operador & a un objeto temporal como en esta declaración
insert(&leftSon(*a),val);Podrías escribir el código sin llamar a las funciones hijo izquierdo o hijo derecho como
if(!empty(rightSon(*a))) insert( &(*a)->right ,val);De hecho, las declaraciones if-else como esta
if(!empty(leftSon(*a))) insert(&leftSon(*a),val); // error here leftson return a tree else { (*a)->left=newNoed(val); }son redundantes. En lugar de ellos, podrías escribir
insert( &(*a)->left, val );y
insert( &(*a)->right, val );Su función rightSon está devolviendo el valor del objeto puntero almacenado en head->right . No puede tomar la dirección de un valor.
En cambio, lo que desea hacer es hacer que rightSon devuelva la dirección de head->right , que luego se puede pasar directamente a insert .
Así que cambie rightSon para devolver la dirección:
tree *rightSon(tree head) { return &head->right; }Y llámalo así:
insert(rightSon(*a),val); presumiblemente, leftSon tiene el mismo problema, así que haga un cambio similar para eso.
Además, ocultar un puntero detrás de una typedef de tipo se considera una mala práctica, ya que ya no es obvio con solo mirar el código que una variable de ese tipo es un puntero y puede causar confusión al lector.